package Thread;

/**
 * @className: lazy_Model
 * @author: 芃
 * @description: 单例-懒汉模式
 * @date: 2024/1/14 19:52
 */
class Singleton2{
    //1.就不是立即初始化实例
    private static volatile Singleton2 instance = null;
    //2.构造方法设为private
    private Singleton2(){

    }
    //3.提供一个方法来获取上述单例的实例
    //   只有当真正需要用到这个实例的时候,才会真正去创建这个实例
    public static Singleton2 getInstance(){
        //如果这个条件成立,说明当前的单例未初始化过,存在线程安全风险,就需要加锁~~
        if(instance == null){
            //这个if的作用：只有再第一次调用方法的时候才会涉及到线程安全问题，后续的调用，没必要每次都进行加锁后判定，所以可以先判断一次是否为空
            synchronized (Singleton2.class){
                if(instance == null){//这个if的作用：防止两个线程同时抢占锁，被其中A抢到了，等A释放锁的时候B再拿到锁，此时A已经是完成了初始化操作了，B此时要判定是否已经完成过初始化了
                    //只有在真正使用到getInstance的时候才会真的创建实例
                    instance = new Singleton2();
                }
            }
        }
        return instance;
    }
}
public class lazy_Model {
    public static void main(String[] args) {
        Singleton2 singleton = Singleton2.getInstance();
        //在第一次调用getInstance的时候才创建实例
    }
}
